/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Data.Enemigo;

/**
 *
 * @author rjimenez
 */
public class Validaciones {




    public int castear(int tipvar, int tipval)
    {
        if(tipvar == Tipo.ENTERO ) //entero
        {
            if(tipval == Tipo.ENTERO)
            {
                return Tipo.ENTERO;
            }
            else if(tipval == Tipo.STRING)
            {
                return Tipo.ENTERO; //error
            }
            else if(tipval == Tipo.BOOL)
            {
                return Tipo.ENTERO;
            }
            else if(tipval == Tipo.FLOAT)
            {
                return Tipo.ENTERO;
            }
            else if(tipval == Tipo.CHAR)
            {
                return Tipo.ENTERO;
            }
            else if(tipval == Tipo.LONG)
            {
                return Tipo.ENTERO;
            }
            else
                return -1;
        }
        else if(tipvar == Tipo.STRING) //cadena
        {
             if(tipval == -1)
             {
                 return -1;
             }
             else
                 return Tipo.STRING;
        }
        else if(tipvar == Tipo.BOOL) //booleanos
        {
             if(tipval == -1)
             {
                 return -1;
             }
             else
                 return Tipo.BOOL;
        }
        else if(tipvar == Tipo.FLOAT) //floats
        {
            if(tipval == Tipo.ENTERO)
            {
                return Tipo.FLOAT;
            }
            else if(tipval == Tipo.STRING)
            {
                return -1; //error
            }
            else if(tipval == Tipo.BOOL)
            {
                return -1;
            }
            else if(tipval == Tipo.FLOAT)
            {
                return Tipo.FLOAT;
            }
            else if(tipval == Tipo.CHAR)
            {
                return -1;
            }
            else if(tipval == Tipo.LONG)
            {
                return Tipo.FLOAT;
            }
            else
                return -1;
        }

        else if(tipvar == Tipo.CHAR) //chars
        {
            if(tipval == Tipo.ENTERO)
            {
                return Tipo.CHAR;
            }
            else if(tipval == Tipo.CHAR)
            {
                return Tipo.CHAR;
            }
            else
            {
                return -1;
            }
        }
        else if(tipvar == Tipo.LONG ) //long
        {
            if(tipval == Tipo.ENTERO)
            {
                return Tipo.LONG;
            }
            else if(tipval == Tipo.STRING)
            {
                return -1; //error
            }
            else if(tipval == Tipo.BOOL)
            {
                return -1;
            }
            else if(tipval == Tipo.FLOAT)
            {
                return Tipo.LONG;
            }
            else if(tipval == Tipo.CHAR)
            {
                return Tipo.LONG;
            }
            else if(tipval == Tipo.LONG)
            {
                return Tipo.LONG;
            }
            else
                return -1;
        }
        else
                return -1;

    }


    public int  ComparacionesOp(int iz, int op, int de )
    {
        int res = -1;
        switch(op)
        {
            case Instruccion.POR: //*
            {
               res = OpPor(iz, de);
               break;
            }
            case Instruccion.DIV://-/-
            {
               res = OpDiv(iz, de);
               break;
            }
            case Instruccion.MAS://+
            {
               res = OpMas(iz, de);
               break;
            }
            case Instruccion.MENOS://-
            {
               res = OpMenos(iz, de);
               break;
            }
            case Instruccion.OPLOGICOS://< > >= <=
            {
               res = OpLogicos(iz, de);
               break;
            }
            case Instruccion.IGUAL:// == !=
            {
               res = OpIgulacion(iz, de);
               break;
            }
            case Instruccion.NOIGUAL:// == !=
            {
               res = OpIgulacion(iz, de);
               break;
            }



        }

        return res;
    }



    public int OpMas(int iz, int de)
    {
        if((iz==Tipo.FLOAT && de==Tipo.ENTERO)||(iz==Tipo.ENTERO && de==Tipo.FLOAT))
        {
            return Tipo.FLOAT;
        }
        else if((iz==Tipo.LONG && de==Tipo.ENTERO)||(iz==Tipo.ENTERO && de==Tipo.LONG))
        {
            return Tipo.LONG;
        }
        else if((iz==Tipo.ENTERO)&&(de==Tipo.ENTERO))
        {
            return Tipo.ENTERO;
        }
        else if((iz==Tipo.FLOAT)&&(de==Tipo.FLOAT))
        {
            return Tipo.FLOAT;
        }
        else if((iz==Tipo.LONG)&&(de==Tipo.LONG))
        {
            return Tipo.LONG;
        }
        else
        {
            return -1;
        }

    }

    public int OpPor(int iz, int de)
    {
        if((iz==Tipo.FLOAT && de==Tipo.ENTERO)||(iz==Tipo.ENTERO && de==Tipo.FLOAT))
        {
            return Tipo.FLOAT;
        }
        else if((iz==Tipo.LONG && de==Tipo.ENTERO)||(iz==Tipo.ENTERO && de==Tipo.LONG))
        {
            return Tipo.LONG;
        }
        else if((iz==Tipo.ENTERO)&&(de==Tipo.ENTERO))
        {
            return Tipo.ENTERO;
        }
        else if((iz==Tipo.FLOAT)&&(de==Tipo.FLOAT))
        {
            return Tipo.FLOAT;
        }
        else if((iz==Tipo.LONG)&&(de==Tipo.LONG))
        {
            return Tipo.LONG;
        }
        else
        {
            return -1;
        }
    }

    public int OpDiv(int iz, int de)
    {
        if((iz==Tipo.FLOAT && de==Tipo.ENTERO)||(iz==Tipo.ENTERO && de==Tipo.FLOAT))
        {
            return Tipo.FLOAT;
        }
        else if((iz==Tipo.LONG && de==Tipo.ENTERO)||(iz==Tipo.ENTERO && de==Tipo.LONG))
        {
            return Tipo.LONG;
        }
        else if((iz==Tipo.ENTERO)&&(de==Tipo.ENTERO))
        {
            return Tipo.ENTERO;
        }
        else if((iz==Tipo.FLOAT)&&(de==Tipo.FLOAT))
        {
            return Tipo.FLOAT;
        }
        else if((iz==Tipo.LONG)&&(de==Tipo.LONG))
        {
            return Tipo.LONG;
        }
        else
        {
            return -1;
        }
    }

    public int OpMod(int iz, int de)
    {
        if((iz==Tipo.FLOAT && de==Tipo.ENTERO)||(iz==Tipo.ENTERO && de==Tipo.FLOAT))
        {
            return Tipo.FLOAT;
        }
        else if((iz==Tipo.LONG && de==Tipo.ENTERO)||(iz==Tipo.ENTERO && de==Tipo.LONG))
        {
            return Tipo.LONG;
        }
        else if((iz==Tipo.ENTERO)&&(de==Tipo.ENTERO))
        {
            return Tipo.ENTERO;
        }
        else if((iz==Tipo.FLOAT)&&(de==Tipo.FLOAT))
        {
            return Tipo.FLOAT;
        }
        else if((iz==Tipo.LONG)&&(de==Tipo.LONG))
        {
            return Tipo.LONG;
        }
        else
        {
            return -1;
        }
    }

    public int OpMenos(int iz, int de)
    {
       if((iz==Tipo.FLOAT && de==Tipo.ENTERO)||(iz==Tipo.ENTERO && de==Tipo.FLOAT))
        {
            return Tipo.FLOAT;
        }
        else if((iz==Tipo.LONG && de==Tipo.ENTERO)||(iz==Tipo.ENTERO && de==Tipo.LONG))
        {
            return Tipo.LONG;
        }
        else if((iz==Tipo.ENTERO)&&(de==Tipo.ENTERO))
        {
            return Tipo.ENTERO;
        }
        else if((iz==Tipo.FLOAT)&&(de==Tipo.FLOAT))
        {
            return Tipo.FLOAT;
        }
        else if((iz==Tipo.LONG)&&(de==Tipo.LONG))
        {
            return Tipo.LONG;
        }
        else
        {
            return -1;
        }
    }


    public int OpLogicos(int iz, int de)
    {
        if((iz==Tipo.FLOAT || iz==Tipo.ENTERO)&&(de==Tipo.ENTERO || de==Tipo.FLOAT))
        {
            return Tipo.BOOL;
        }
        else if((iz==Tipo.LONG || iz==Tipo.ENTERO)&&(de==Tipo.ENTERO || de==Tipo.LONG))
        {
            return Tipo.BOOL;
        }
        else if((iz==Tipo.LONG || iz==Tipo.FLOAT)&&(de==Tipo.FLOAT || de==Tipo.LONG))
        {
            return Tipo.BOOL;
        }
        else
        {
            return -1;
        }

    }


    public int OpIgulacion(int iz, int de)
    {
        if((iz==Tipo.FLOAT && de==Tipo.ENTERO)||(iz==Tipo.ENTERO && de==Tipo.FLOAT))
        {
            return Tipo.BOOL;
        }
        else if((iz==Tipo.LONG && de==Tipo.ENTERO)||(iz==Tipo.ENTERO && de==Tipo.LONG))
        {
            return Tipo.BOOL;
        }
        else if((iz==Tipo.LONG && de==Tipo.FLOAT)||(iz==Tipo.FLOAT && de==Tipo.LONG))
        {
            return Tipo.BOOL;
        }
        else if((iz == de))
        {
            return Tipo.BOOL;
        }
        else
        {
            return -1;
        }
    }


    public int OpCond(int iz, int de)
    {
        if(iz==Tipo.BOOL && de==Tipo.BOOL)
        {
            return Tipo.BOOL;
        }
        else
        {
            return -1;
        }
    }






    public int opAsig(int iz, int de)
    {
        if(iz==Tipo.FLOAT && (de==Tipo.FLOAT||de==1))
        {
            return Tipo.FLOAT;
        }
        else if(iz==de)
        {
            return iz;
        }
        else
        {
            return -1;
        }
    }

}
